home *** CD-ROM | disk | FTP | other *** search
/ The X-Philes (2nd Revision) / The X-Philes Number 1 (1995).iso / xphiles / hp48_1 / dec2frac / comp.sys.handhelds_5239_000000.msg
Internet Message Format  |  1995-03-31  |  3KB

  1. Path: en.ecn.purdue.edu!noose.ecn.purdue.edu!samsung!mips!sdd.hp.com!hp-pcd!hpcvra.cv.hp.com!rnews!hpcvbbs!akcs.Guest_
  2. From: akcs.Guest_@hpcvbbs.UUCP (Joseph K. Horn)
  3. Newsgroups: comp.sys.handhelds
  4. Subject: HP 48 Improved ->Q
  5. Keywords: hp 48 ->q fractions faster better
  6. Message-ID: <27e87852:2491comp.sys.handhelds@hpcvbbs.UUCP>
  7. Date: 21 Mar 91 09:40:09 GMT
  8. Lines: 64
  9.  
  10. %%HP:T(3);
  11. @ DEC2FRAC for the HP 48SX (obsoletes ->Q)
  12. @ Improved Decimal-to-Fraction, by Joseph K. Horn.
  13. @
  14. @ Faster & more complete than HP 48SX (->Q function) and HP 32SII
  15. @   (with maximum denominator set), both of which miss many solutions,
  16. @   and slowly recalculate the summations for each term rather than
  17. @   using a fast recursion formula to get each term from the last two.
  18. @ This new algorithm finds the very best solution, very quickly.
  19. @ Algorithm: Continued Fractions by fast recursion formula, then jump
  20. @   backwards to the best possible fraction before the specified
  21. @   maximum denominator.
  22. @
  23. @   Copyright (c) 1991 by Joseph K. Horn.
  24. @   May be used freely in any application that has no documentation.
  25. @   May be in a documented application if the above author is credited.
  26. @
  27. @ Input:
  28. @
  29. @ 2: Decimal Number to be converted to a fraction
  30. @ 1: Maximum Allowed Denominator (a positive integer)
  31. @
  32. @ Output:
  33. @
  34. @ 1: 'Numerator/Denominator'
  35. @
  36. @ Example: What fraction is closest to the number "e", but
  37. @   with a denominator not bigger than 20?  It's 49/18.
  38. @
  39. @ The HP 48SX and the HP 32SII say it's 19/7.  They say that the next
  40. @   better fraction is 87/32.  But there are two fractions between
  41. @   these which are missed: 49/18 and 68/25.
  42. @
  43. @ Press 1 EXP 20 DEC2FRAC and see '49/18', the correct answer.
  44. @
  45. @ An example of speed increase is the golden ratio, (sqr(5)+1)/2, which
  46. @   is approximately 514229/317811.  This is found by the HP 48SX ->Q
  47. @   function in 3.23 seconds, and by DEC2FRAC in 1.29 seconds.
  48. @
  49. @ Checksum = # 4F52h; Size on stack = 296.5 bytes.
  50. @
  51. \<< DUP2 @ Must be two arguments.  Exit now if max denominator < 2, or
  52.   IF 1 > SWAP FP AND @ if decimal fraction is an integer.
  53.   THEN \-> f c @ Store decimal fraction, and max denominator.
  54.     \<< 0 1 f @ Calculate only denominators.  Do numerator only at end.
  55.       WHILE OVER c < OVER AND @ Do until bigger than max denominator
  56.       REPEAT INV DUP FP 4 ROLLD IP OVER * ROT + ROT @ This is the
  57.       END DROP DUP2 c @ recursion formula continued fraction expansion.
  58.       IF DUP2 > @ Is there a possible "missing" fraction?
  59.       THEN - OVER / CEIL * - @ This is the new, fast "jump backwards".
  60.       ELSE 3 DROPN @ (Sometimes there's no need to jump.)
  61.       END DUP2 1 2 @ Take the new denominator & the previous one, and
  62.       START DUP f * 0 RND SWAP / f - ABS SWAP @ turn into fractions.
  63.       NEXT @ See which one's closest to the original decimal fraction.
  64.       IF > @ Compare the two solutions, and
  65.       THEN SWAP @ pick the better one.
  66.       END DROP DUP f * 0 RND SWAP @ Calculate the numerator.
  67.     \>> @ End of real work; now clean up the output.
  68.     IF DUP ABS 1 > @ Is the denominator greater than 1?
  69.     THEN # 5603Eh SYSEVAL @ If so, make output into 'A/B' form.
  70.     ELSE DROP @ Otherwise, get rid of extraneous denominator,
  71.     END @ and exit program.
  72.   ELSE DROP @ If bad arguments, do nothing to "decimal fraction", but
  73.   END @ get rid of "maximum denominator" and exit program.
  74. \>>
  75.